#include <iostream>
#include <jsoncpp/json/json.h>
#include <sstream>
#include <string>
std::string serialize()
{
    // 1. 将需要序列化的数据仿佛Value对象中
    Json::Value root;
    root["姓名"] = "张三";
    root["年龄"] = 20;
    root["成绩"].append(99);
    root["成绩"].append(88);
    root["成绩"].append(77);
    // 2. 实例化一个StreamWriterBilder工厂类对象
    Json::StreamWriterBuilder swb;
    // 3. 通过StreamWriterBilder工厂对象生产一个StreamWriter对象
    Json::StreamWriter *sw = swb.newStreamWriter();
    // 4. 通过StreamWriter对象对：Json:Value中存储的数据进行序列化
    std::stringstream ss;
    int ret = sw->write(root, &ss); // 向字符流中写入格式化后的字符串
    if (ret != 0)
    {
        std::cerr << "writer error !" << std::endl;
        return "";
    }
    std::cout << ss.str() << std::endl;
    delete sw;
    return ss.str();
}
void unserialize(std::string str)
{
    // 2. 实例化一个CharReaderBilder工厂类对象
    Json::CharReaderBuilder cb;
    // 3. 通过CharReaderBilder工厂对象生产一个CharStream对象
    Json::CharReader *cr = cb.newCharReader();
    // 3. 定义一个Json::Value对象存储解析后数据
    Json::Value root;
    std::string err;
    // 4. 通过CharStream对象对：Json格式字符串进行反序列化:err:该变量用于存储解析过程中可能出现的错误信息
    bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
    if (ret == false)
    {
        std::cout << "parse error !" << std::endl;
        return;
    }
    // 5. 逐个元素访问Value root数据
    std::cout << "姓名:" << root["姓名"].asString() << std::endl;
    std::cout << "年龄:" << root["年龄"].asInt() << std::endl;
    int sz = root["成绩"].size();
    for(int i = 0; i < sz; i++)
    {
        std::cout<<"成绩："<< root["成绩"][i].asFloat()<<std::endl;
    }
    delete cr;
}
int main()
{
    // 1. 序列化
    std::string str = serialize();
    // 2. 反序列化
    unserialize(str);
    return 0;
}